// undefined 是个变量，不是个关键字，类型只是一个值，避免无意中被篡改，用void 0

let a = undefined

let b = void 0

let c = null

let d; // 未赋值的自然状态


// Boolean
true
false

// string 是字符串的UTF16编码，而并非是字符串
// 最大长度
2^53 - 1
charAt
charCodeAt
length

UTF-16
UTF-8


// Number
// IEEE 754-2008 双精度浮点数规则
// JS为了表达几个额外的语言场景(比如 x / 0不出错)，而引入了无穷大的概念
NaN
Infinity
-Infinity
1 / x === Infinity || -Infinity
// -0x1ffffffffffff ~ 0x1ffffffffff

0.1 + 0.2 == 0.3


// Symbol
// 一切非字符串的key的合集
let s1 = Symbol('hello')
let s2 = Symbol('hell0')


var o = new Object()
o[Symbol.iterator] = function() {
    var v = 0
    return {
        next: function()
    {
        return { value: v++, done: v > 10}
    }
    } 
}

for (var v of o) {
    console.log(v);
}

// Object
// 对象的定义：属性的集合

// class 类
3
new Number(3)


Number
String
Boolean

Number(2)
'abc'.charAt(0) // a

Symbol.prototype.hello = () => console.log('hello');
var h = Symbol('a')
console.log(h);
h.hello()

let